package app

import (
	"flag"
	"fmt"
	"os"

	"ginweb/config"
	"ginweb/config/loader"

	"go.uber.org/zap" // 引入 zap 日志库
)

var (
	logger *zap.Logger // 全局日志实例
)

func init() {
	// 初始化日志库
	var err error
	logger, err = zap.NewProduction() // 生产环境日志配置
	if err != nil {
		fmt.Printf("Failed to initialize logger: %v\n", err)
		os.Exit(1)
	}
	defer func() {
		_ = logger.Sync() // 确保日志写入完成
	}()
}

// Bootstrap 是项目的启动入口
func Bootstrap() {
	// 解析命令行参数，支持动态指定环境
	env := flag.String("env", "dev", "Specify the environment (e.g., dev, prod)")
	flag.Parse()

	// 加载配置
	if err := loadConfig(*env); err != nil {
		logger.Error("Failed to load configuration", zap.Error(err))
		os.Exit(1) // 配置加载失败时优雅退出
	}

	// 监听配置变化
	if err := watchConfigChanges(); err != nil {
		logger.Error("Failed to start config watcher", zap.Error(err))
		os.Exit(1) // 配置监听失败时优雅退出
	}

	logger.Info("Application started successfully")
}

// loadConfig 封装配置加载逻辑
func loadConfig(env string) error {
	logger.Info("Loading configuration", zap.String("environment", env))
	return loader.LoadConfig(env)
}

// watchConfigChanges 封装配置监听逻辑
func watchConfigChanges() error {
	logger.Info("Starting config change watcher")
	return config.WatchConfigChanges()
}
